package cn.oowoo.rabbitmqclient2001.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    //定义三个交换机
    @Bean
    public DirectExchange directExchange(){//定义直连交换机
        return new DirectExchange("DIRECT_EXCHANGE");
    }
    @Bean
    public TopicExchange topicExchange(){//定义主题交换机
        return new TopicExchange("TOPIC_EXCHANGE");
    }
    @Bean
    public FanoutExchange fanoutExchange(){//定义广播交换机
        return new FanoutExchange("FANOUT_EXCHANGE");
    }

    //定义四个队列
    @Bean
    public Queue firstQueue(){
        return new Queue("FIRST_QUEUE");
    }
    @Bean
    public Queue secondQueue(){
        return new Queue("SECOND_QUEUE");
    }
    @Bean
    public Queue thirdQueue(){
        return new Queue("THIRD_QUEUE");
    }
    @Bean
    public Queue fourthQueue(){
        return new Queue("FOURTH_QUEUE");
    }

    @Bean
    public Queue fiveQueue(){
        return new Queue("FIVE_QUEUE");
    }
    //定义四个绑定关系(交换机与队列绑定)
    @Bean
    public Binding bindFirst(@Qualifier("firstQueue")Queue queue, @Qualifier("directExchange")DirectExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("gupao.best");//参数：绑定队列、交换机、关键字，匹配到关键字的消息才会进入到队列
    }


    @Bean
    public Binding bindSecond(@Qualifier("secondQueue")Queue queue,@Qualifier("topicExchange")TopicExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("*.gupao.*");//使用通配符模糊匹配，匹配通过的消息才会进入到队列
    }

    @Bean
    public Binding bindThird(@Qualifier("thirdQueue")Queue queue,@Qualifier("fanoutExchange")FanoutExchange exchange){
        return BindingBuilder.bind(queue).to(exchange);//广播类型的交换机不能指定关键字，所以没有with这样的方法
    }

    @Bean
    public Binding bindFourth(@Qualifier("fourthQueue")Queue queue,@Qualifier("fanoutExchange")FanoutExchange exchange){
        return BindingBuilder.bind(queue).to(exchange);//广播类型的交换机不能指定关键字，所以没有with这样的方法
    }


/*

    1.Direct：定向，把消息交给符合特定routing key 的队列。

　　2.Fanout:广播，将消息分发给所有绑定到交换机的队列。　

　　3.Topic：通配符，把消息交给符合routing pattern （路由模式）的队列。

*/

}
